package ouc.pkere.utils.generator;

import ouc.pkere.utils.generator.codegen.EntityJavaCodeGenerator;
import ouc.pkere.utils.generator.codegen.RepositoryJavaCodeGenerator;
import ouc.pkere.utils.generator.codegen.ServiceJavaCodeGenerator;
import ouc.pkere.utils.generator.entity.DbSqlModuleConfigMetaData;
import ouc.pkere.utils.generator.config.entity.DbSqlModuleItemEntity;
import ouc.pkere.utils.generator.config.entity.DbSqlModulesEntity;
import ouc.pkere.utils.generator.config.xmltools.DbSqlModulesConfigXmlDomParser;

import org.springframework.core.io.Resource;
import org.springframework.core.io.ClassPathResource;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * 模块自动生成执行器
 * @author Wang Xiaodong
 * 2018-06-12
 */
public class Executor {
    private Resource resource;
    private File file;
    private DbSqlModulesEntity dbSqlModulesEntity;
    // App配置文件
    private String configFile = "AppConfig.xml";

    public Executor() {
        resource = new ClassPathResource(configFile);

        try {
            file = resource.getFile();
        } catch (IOException e) {
            e.getStackTrace();
        }

        dbSqlModulesEntity = DbSqlModulesConfigXmlDomParser.getDbSqlModulesConfigXmlDomParser()
                .parseDbSqlModulesConfigXmlToObject(file);
    }

    public List<DbSqlModuleConfigMetaData> dbSqlModulesConfigMetaDataParse() {
        List<DbSqlModuleConfigMetaData> dbSqlModuleConfigMetaDataList = new ArrayList<>();
        DbSqlModuleConfigMetaData dbSqlModuleConfigMetaData;
        DbSqlModuleItemEntity dbSqlModuleItemEntity;

        Iterator<DbSqlModuleItemEntity> dbSqlModuleItemEntityIterator = dbSqlModulesEntity.getDbSqlModuleItemEntityList().iterator();

        while (dbSqlModuleItemEntityIterator.hasNext()) {
            dbSqlModuleConfigMetaData = new DbSqlModuleConfigMetaData();
            dbSqlModuleItemEntity = dbSqlModuleItemEntityIterator.next();

            dbSqlModuleConfigMetaData.setModuleId(dbSqlModuleItemEntity.getId());
            dbSqlModuleConfigMetaData.setModuleNickname(dbSqlModuleItemEntity.getNickname());
            dbSqlModuleConfigMetaData.setModuleName(dbSqlModuleItemEntity.getName());
            dbSqlModuleConfigMetaData.setModulePkg(dbSqlModuleItemEntity.getPkg());
            dbSqlModuleConfigMetaData.setModuleDescription(dbSqlModuleItemEntity.getDescription());
            dbSqlModuleConfigMetaData.setModuleTable(dbSqlModuleItemEntity.getTable());
            dbSqlModuleConfigMetaData.setModuleStatus(dbSqlModuleItemEntity.getStatus());
            dbSqlModuleConfigMetaData.setModuleUrl(dbSqlModuleItemEntity.getUrl());

            dbSqlModuleConfigMetaDataList.add(dbSqlModuleConfigMetaData);

        }

        return dbSqlModuleConfigMetaDataList;
    }

    public String createModulePath(String pathName) {
        File path = new File(pathName);

        if (path.exists()) {
            Date day = new Date();
            SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            path.renameTo(new File(pathName + ".bak." + df.format(day)));
        }

        path.mkdirs();

        if (path.exists()) {
            return path.getAbsolutePath();
        }

        return "Create Module Path Failed.";

    }

    public void execute() {
        DbSqlModuleConfigMetaData dbSqlModuleConfigMetaData;
        Iterator<DbSqlModuleConfigMetaData> iterator = dbSqlModulesConfigMetaDataParse().iterator();

        while (iterator.hasNext()) {
            dbSqlModuleConfigMetaData = iterator.next();

            // 仅仅重新构建status为 build 和 rebuild 的模块
            if (dbSqlModuleConfigMetaData.getModuleStatus().equals("build")
                    || dbSqlModuleConfigMetaData.getModuleStatus().equals("rebuild")) {

                // 创建模块目录
                System.out.println("[Rebuild Module] Module Name: " + dbSqlModuleConfigMetaData.getModuleName() +
                        " at path: " + createModulePath(dbSqlModuleConfigMetaData.getModulePath()));

                // 创建Entity
                String primaryKeyTypeStr = new EntityJavaCodeGenerator().tableToEntity(dbSqlModuleConfigMetaData.getModuleTable(),
                        dbSqlModuleConfigMetaData.getModulePkg(),
                        dbSqlModuleConfigMetaData.getModulePath(),
                        dbSqlModuleConfigMetaData.getModuleEntityClassName());

                System.out.println(primaryKeyTypeStr);

                // 创建Repository
                new RepositoryJavaCodeGenerator(primaryKeyTypeStr,
                        dbSqlModuleConfigMetaData.getModulePkg(),
                        dbSqlModuleConfigMetaData.getModulePath(),
                        dbSqlModuleConfigMetaData.getModuleName()).generate();

                // 创建Service
                new ServiceJavaCodeGenerator(dbSqlModuleConfigMetaData.getModulePkg(),
                        dbSqlModuleConfigMetaData.getModulePath(),
                        dbSqlModuleConfigMetaData.getModuleName()).generate();

            } else if (dbSqlModuleConfigMetaData.getModuleStatus().equals("active")
                    || dbSqlModuleConfigMetaData.getModuleStatus().equals("inactive")) {
                System.out.println("[Module Locked] Module Name: " + dbSqlModuleConfigMetaData.getModuleName());
            }
        }

    }

    public static void main(String[] args) {
        Executor exe = new Executor();
        exe.execute();
    }
}

